#include "Elfe.h"
using namespace std;

const unsigned int Elfe::ens = 5;

const unsigned int Elfe::nbr_comp = 6;

const unsigned int Elfe::ensemble_racial[5][6] =
  { {3 , 6 , 19, 11, 10,  0}, // aquatiques
    {14, 8 , 11, 10, 6 , 16}, // gris
    {8 , 11, 10, 1 , 6 ,  0}, // drows
    {14, 8 , 11, 10, 6 , 18}, // sylvestre  
    {14, 8 , 11, 10, 6 , 16}  // haut elfe
  };

const unsigned int Elfe::taille = 24;

const ListCapa Elfe::Liste[24] = {
  {"Capacités magiques"               , 15},
  {"Compagnion"                       , 10},
  {"Conférer la respiration aquatique", 10},
  {"Dextérité renforcée"              , 20},
  {"Faibles besoins de sommeil"       ,  5},
  {"Furtivité"                        , 10},
  {"Identification de la magie"       , 10},
  {"Infravision"                      , 10},
  {"Langage des plantes"              , 10},
  {"Portes secrètes"                  ,  5},
  {"Résistance aux charmes et sommeil", 10},
  {"Résistance à la chaleur"          ,  5},
  {"Résistance au froid"              ,  5},
  {"Talent pour les arcs"             ,  5},
  {"Talent pour les dagues"           ,  5},
  {"Talent pour les épées"            ,  5},
  {"Talent pour les javelots"         ,  5},
  {"Talent pour les lances"           ,  5},
  {"Talent pour les tridents"         ,  5},
  {"Elfe aquatique"                   , 40},
  {"Elfe gris"                        , 45},
  {"Elfe Noir"                        , 45},
  {"Elfe sylvestre"                   , 40},
  {"Haut-Elfe"                        , 40}
};

Elfe::Elfe(vector<unsigned int> cap)
  :Race("Elfe")
{
  for (unsigned int i(0); i < cap.size(); i++)
    capacites.push_back(cap[i]);
}

Elfe::Elfe(unsigned int& PP)
  :Race("Elfe"), bonus_dext(false)
{
  dout(BLANK) << setfill('*') << setw(56) << '*' << endl;
  dout(BLANK) << "Création d'un elfe" << endl << endl;
  
  unsigned int nbr(0), taille(24);
  bool test(true), deja_pris, encore(false);
  PP = 45;
  do
    {
      dout(BLANK) << "Tu as 45 pp à dépenser" << endl;
      for (unsigned int i(0); i<taille; i++)
	dout(BLANK) << i+1 << ' ' << (Liste[i].Capa)
		    << " (" << Liste[i].Cout << " pp)" << endl;
      dout(BLANK) << taille+1 << " Aucune" << endl;
      dout(BLANK) << "Choisir les capacités raciales" << endl;
      while(test)
	{
	  nbr = demander_unsigned_borne("("+write_int(PP)+" pp restants ",
					1, taille + 1);
	  if (nbr == taille+1)
	    test = false;
	  else
	    {
	      if (PP >= Liste[nbr-1].Cout)
		{
		  PP -= Liste[nbr-1].Cout;
		  if (nbr<20)
		    {
		      deja_pris = safe_push_back(&capacites, nbr - 1);
		      if (deja_pris)
			dout(WARN) << "Déjà sélectionné" << endl;
		      else
			{
			  capacites.push_back(nbr-1);
			  dout(BLANK) << "Capacité choisie : "
				      << (Liste[nbr-1].Capa) << endl;
			}
		      if (nbr == 1)
			bonus_dext = true;
		    }
		  else
		    {
		      dout(BLANK) << "Achat de l'ensemble racial : "
				  << (Liste[nbr-1].Capa) << endl;
		      for (unsigned int i(0); i < nbr_comp; i++)
			{
			  if (ensemble_racial[nbr-20][i] != 0)
			    capacites.push_back(ensemble_racial[nbr-20][i]-1);
			}
		    }
		  
		}
	      else
		dout(BLANK) << "Pas assez de pp" << endl;
	    }
    }
      
      affiche_info();
      dout(BLANK) << endl <<  "1 pour continuer, 2 pour recommencer" << endl;
      nbr = demander_unsigned_borne("Choix ", 1, 2);
      if (nbr == 2)
	{
	  PP = 45;
	  capacites.clear();
	  test = true;
	  encore = true;
	  dout(BLANK) << endl;
	}
      else
	encore = false;
    }
  while(encore);
  
  dout(BLANK) << endl << setfill('*') << setw(56) << '*' << endl;

}

Elfe::~Elfe()
{}

void Elfe::appliquer_ajustements(unsigned int tab[6])
{
  tab[1]++;
  tab[2]--;
  if (bonus_dext)
    tab[1]++;
}

void Elfe::affiche_info()
{
  dout(BLANK) << "Race : " << Type << endl;
  for (unsigned int i(0); i<capacites.size(); i++)
    dout(BLANK) << (Liste[capacites[i]].Capa) << endl;
}

string Elfe::get_capacite(const unsigned int& i) const
{
  return (Liste[get_capa(i)].Capa);
}
